﻿using UnityEngine;
using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;


public partial class PropSet
{
    #region 百分比类型的属性

    /// <summary>
    /// 百分比类型的属性
    /// </summary>
    private static List<PropType> _propPctList = null;
    public static List<PropType> PropPctList
    {
        get
        {
            if (null == _propPctList)
            {
                _propPctList = new List<PropType>();

                _propPctList.Add((PropType)20);//20.物理攻击百分比
                _propPctList.Add((PropType)21);//21.法术攻击百分比
                _propPctList.Add((PropType)22);//22.物理防御百分比
                _propPctList.Add((PropType)23);//23.法术防御百分比
                _propPctList.Add((PropType)24);//24.生命值上限百分比
                _propPctList.Add((PropType)25);//25.命中百分比
                _propPctList.Add((PropType)26);//26.闪避百分比
                _propPctList.Add((PropType)27);//27.暴击加成百分比
                _propPctList.Add((PropType)28);//28.治疗加成百分比
                _propPctList.Add((PropType)29);//29.伤害加成百分比
                _propPctList.Add((PropType)30);//30.伤害减免百分比
            }

            return _propPctList;
        }
    }
    #endregion

    #region 默认要显示的属性

    /// <summary>
    /// 默认要显示的属性
    /// </summary>
    private static List<PropType> _defaultShowPropTypeList = null;
    public static List<PropType> DefaultShowPropTypeList
    {
        get
        {
            if (null == _defaultShowPropTypeList)
            {
                _defaultShowPropTypeList = new List<PropType>();

                _defaultShowPropTypeList.Add((PropType)1);//1.力量
                _defaultShowPropTypeList.Add((PropType)2);//2.体质
                _defaultShowPropTypeList.Add((PropType)3);//3.敏捷
                _defaultShowPropTypeList.Add((PropType)4);//4.自然
                _defaultShowPropTypeList.Add((PropType)5);//5.血量
                _defaultShowPropTypeList.Add((PropType)6);//6.物理攻击力
                _defaultShowPropTypeList.Add((PropType)7);//7.法术攻击力
                _defaultShowPropTypeList.Add((PropType)8);//8.物理防御力
                _defaultShowPropTypeList.Add((PropType)9);//9.法术防御力
                _defaultShowPropTypeList.Add((PropType)10);//10.命中
                _defaultShowPropTypeList.Add((PropType)11);//11.闪避
                _defaultShowPropTypeList.Add((PropType)12);//12.攻击顺序
                _defaultShowPropTypeList.Add((PropType)13);//13.物理爆击率
                _defaultShowPropTypeList.Add((PropType)15);//15.格挡
                _defaultShowPropTypeList.Add((PropType)16);//16.破击
                _defaultShowPropTypeList.Add((PropType)18);//18.破甲
                _defaultShowPropTypeList.Add((PropType)19);//19.破魔
                _defaultShowPropTypeList.Add((PropType)27);//27.暴击加成百分比
                _defaultShowPropTypeList.Add((PropType)28);//28.治疗加成百分比
                _defaultShowPropTypeList.Add((PropType)29);//29.伤害加成百分比
                _defaultShowPropTypeList.Add((PropType)30);//30.伤害减免百分比
            }

            return _defaultShowPropTypeList;
        }
    }
    #endregion

    public const string NameFormat = "{Name}";
    public const string ValueFormat = "{Value}";
    public const string NameAndValueFormat = "{Name}：{Value}";

    /// <summary>
    /// 获取自身默认要显示的属性
    /// </summary>
    public string Desc { get { return GetDesc(DefaultShowPropTypeList, NameAndValueFormat); } }


    /// <summary>
    /// 获取自身所有非0属性说明
    /// </summary>
    public string NotZeroDesc { get { return GetDesc(GetNotZeroTypeList(), NameAndValueFormat); } }


    /// <summary>
    /// 获取非0的属性类型
    /// </summary>
    public List<PropType> GetNotZeroTypeList()
    {
        List<PropType> propList = new List<PropType>();

        for (int i = (int)PropType.None + 1, iMax = (int)PropType.MAX; i < iMax; ++i)
        {
            if (this[i] == 0) continue;
            propList.Add((PropType)i);
        }

        return propList;
    }


    /// <summary>
    /// 获取要显示的属性信息
    /// </summary>
    public string GetDesc(List<PropType> props, string formatStr)
    {
        StringBuilder sb = new StringBuilder();

        // 所有属性值说明
        for (int i = 0; i < props.Count; ++i)
        {
            if (sb.Length > 0) sb.Append("\n");
            sb.Append(GetNameAndValueStr(props[i], formatStr));
        }

        return sb.ToString();
    }


    /// <summary>
    /// 获取属性名和属性值字符串
    /// </summary>
    public string GetNameAndValueStr(PropType pType, string formatStr)
    {
        if (!IsValid(pType)) return string.Empty;

        string nameStr = GetPropName(pType);
        string valueStr = GetValueStr(pType);

        string nameAndValueStr = formatStr.Replace(NameFormat, nameStr);
        nameAndValueStr = nameAndValueStr.Replace(ValueFormat, valueStr);

        return nameAndValueStr;
    }


    /// <summary>
    /// 获取属性对应的中文说明
    /// </summary>
    public static string GetPropName(PropType propType)
    {
        if (!IsValid(propType)) return string.Empty;
        string propName = ("PropObject_" + (int)propType);//.ToLanguage();
        return propName;
    }

    /// <summary>
    /// 获取属性显示文本
    /// </summary>
    private string GetValueStr(PropType pType)
    {
        if (!IsValid(pType)) { return string.Empty; }

        float propValue = this[pType];
        bool isPer = PropPctList.Contains(pType); // 是否为百分比属性
        string valueStr = isPer ? (propValue * 100).ToString("n2") : ((int)propValue).ToString();
        string perStr = isPer ? "%" : string.Empty;
        // string formatStr = propValue > 0 ? "+{0}{1}" : "{0}{1}";
        //return string.Format(formatStr, valueStr, perStr);
        return string.Format("{0}{1}", valueStr, perStr);
    }


    /// <summary>
    /// 属性类型有效果性判定
    /// </summary>
    public static bool IsValid(PropType propType)
    {
        if (propType <= PropType.None || propType >= PropType.MAX)
        {
            return false;
        }

        return true;
    }
}
